#include <string>
#include <cstring>

using namespace std;

// 无重复字符的最长子串
// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
// 测试链接 : https://leetcode.cn/problems/longest-substring-without-repeating-characters/

class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        // char -> int -> 0 ~ 255
        // 每一种字符上次出现的位置
        int last[128]{}; // 一种有 128 个字符
        // 所有字符都没有上次出现的位置
        memset(last, 0xff, sizeof(last)); // 0xffffffff -> -1
        // 不含有重复字符的 最长子串 
        int ans = 0, n = s.size();
        for(int l = 0, r = 0; r < n; ++r)
        {
            l = max(l, last[s[r]] + 1);
            ans = max(ans, r - l + 1);
            // 更新当前字符上一次出现的位置
            last[s[r]] = r;
        }
        return ans;
    }
};


class Solution 
{
public:
    int lengthOfLongestSubstring(string s) 
    {
        int m[128]{}, left = 0, right = 0, n = s.size(), ret = 0;
        while(right < n)
        {
            ++m[s[right]];
            while(m[s[right]] > 1)
            {
                --m[s[left++]];
            }
            ret = max(ret, right - left + 1);
            ++right;
        }
        return ret;
    }
};